<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 
        1.代码分类
            *全局代码
            *函数(局部)代码
        2.全局执行上下文
            *在执行全局代码前将window确定为全局执行上下文
            *对全局数据进行预处理
                *var定义的全局变量==>undefined,添加为window的属性
                *function声明的全局函数==>赋值(fun),添加为window的方法
                *this==>赋值(window)
            *开始执行全局代码
        3.函数执行上下文
            *在调用函数,准备执行函数体之前,创建对应的函数执行上下文对象
            *对局部数据进行预处理
                *形参变量==>赋值(实参)==>添加为执行上下文的属性
                *arguments==>赋值(实参列表),添加为执行上下文的属性
                *var定义的局部变量==>urdefined,添加为执行上下文的属性
                *function声明的函数==>赋值(fun),添加为执行上下文的方法
                *this==>赋值(调用函数的对象)
            *开始执行函数体代码
     -->
     <script>
        // 全局执行上下文
        console.log(a1,window.a1);
        a2()
        console.log(this);

        var a1 = 3
        function a2(){
            console.log('a2()');
        }
        console.log('-----------------------------');

        // 函数执行上下文
        function fn(a1){
            console.log(a1);        //2
            console.log(a2);        //undefined    
            a3()                    //a3()
            console.log(this);      //window
            console.log(arguments); //伪数组[2,3]

            var a2 = 3
            function a3(){
                console.log('a3()');
            }
        }
        fn(2,3)
     </script>
</body>
</html>